#ifndef DBPAGEWIDGET_H
#define DBPAGEWIDGET_H

#include <QObject>
#include <QTableView>
#include <QLabel>
#include <QAbstractButton>
#include <QSqlDatabase>
#include <QSqlQueryModel>
#include "dbnotescount.h"
#include "mysqlquery.h"
#include "BtWidget_global.h"

class BTWIDGET_EXPORT DBPageWidget : public QObject
{
    Q_OBJECT
public:
    explicit DBPageWidget(QObject *parent = nullptr);

    /*------------------- 查询时使用到的控件 -----------------*/
    //设置显示结果的tableview
    void setTableView(QTableView *tableView);
    //设置导航按钮
    void setNavButton(QAbstractButton* btnPrevPage,
                      QAbstractButton *btnNextPage,
                      QAbstractButton *btnFirstPage=nullptr,
                      QAbstractButton *btnLastPage = nullptr);
    //设置前一页按钮
    void setBtnPrevPage(QAbstractButton *btnPrevPage);
    //设置后一页按钮
    void setBtnNextPage(QAbstractButton *btnNextPage);
    //设置第一页按钮
    void setBtnFirstPage(QAbstractButton *btnFirstPage);
    //设置最后一页按钮
    void setBtnLastPage(QAbstractButton *btnLastPage);
    //设置信息显示label "第 i/n 页"
    void setLabelPageInfo(QLabel *labelPageInfo);
    //设置信息显示label "第 i 页"
    void setLabelCurrentPageIdx(QLabel *labelCurrentPageIdx);
    //设置信息显示label "共 n 页"
    void setLabelTotalPages(QLabel *labelTotalPages);
    //设置信息显示label "共 n 条"
    void setLabelTotalNotes(QLabel *labelTotalNotes);
    //设置信息显示label "第 xxx~xxx 条"
    void setLabelCurrentNotes(QLabel *labelCurrentNotes);
    //设置信息显示label "每页 x 条"
    void setLabelNotesInPerPage(QLabel *labelNotesInPerPage);

    /*------------------- 数据库相关设置 -----------------*/
    void setDbInfo(const QString &dbFileName, const QString &dbCommName);
    void setDbQueryInfo(const QString &dbTableName,     /*"tableName"*/
                        const QString &dbColumnsSql,    /*"id,name,index"*/
                        const QString &dbWhereSql,      /*"where id>10"*/
                        const QString &dbOrderSql);     /*"id asc"*/
    //设置数据库文件名称
    void setDbFileName(const QString &dbFileName);
    //设置数据库连接连接名称
    QString dbCommName() const;
    void setDbCommName(const QString &dbCommName);
    //设置表名称
    void setDbTableName(const QString &dbTableName);
    //设置查询列名称
    void setDbColumnsSql(const QString &dbColumnsSql);
    //设置排序条件
    void setDbOrderSql(const QString &dbOrderSql);
    //设置查询条件
    void setDbWhereSql(const QString &dbWhereSql);
    //设置统计表行数的字段**
    void setDbCountName(const QString &dbCountName);

    //每页显示多少条数据
    void setINotesPerPage(int iNotesPerPage);
    //设置每一列的名称 需要结合setDbColumnsSql进行设置
    void setColumnNamesList(const QList<QString> &ColumnNamesList);
    //设置每一列的宽度
    void setColumnWidthList(const QList<int> &ColumnWidthList);

    /*------------------- 相关操作设置 -----------------*/
    // 初始化 设置tableView的样式等信息
    void init();
    // 执行查询操作
    void query();

signals:
    void showPageInfo(const QString stInfo);
    void queryNotesCount(const QString sql);

public slots:
    void showPrevPage();
    void showNextPage();
    void showFirstPage();
    void showLastPage();

private slots:
    void dbNoteCount(int count, double msec);

private:
    void showData(QString sql);
    void showDataByPage(int iPage);
    void setPagesInfo();
    void changeButtonState();

    void setBtnPrevPageEnable(bool bEnabled);
    void setBtnNextPageEnable(bool bEnabled);
    void setBtnFirstPageEnable(bool bEnabled);
    void setBtnLastPageEnable(bool bEnabled);

private:
    //控件变量
    QTableView* m_tableView;            //tableView 显示控件
    QAbstractButton* m_btnPrevPage;     //前一页按钮
    QAbstractButton* m_btnNextPage;     //后一页按钮
    QAbstractButton* m_btnFirstPage;    //第一页按钮
    QAbstractButton* m_btnLastPage;     //最后一页按钮

    QLabel* m_labelPageInfo;        //用于显示 “第i/n页” 信息
    QLabel* m_labelCurrentPageIdx;  //用于显示 当前页 信息
    QLabel* m_labelTotalPages;      //用于显示 共多少页 信息
    QLabel* m_labelTotalNotes;      //用于显示 共多少条 信息
    QLabel* m_labelCurrentNotes;    //用于显示 当前多少条 信息
    QLabel* m_labelNotesInPerPage;  //用于显示 每页共多少条 信息

    //需要设置的变量
    QString m_dbCommName;   //设置数据库连接名称
    QString m_dbTableName;  //数据库表名称
    QString m_dbColumnsSql; //查询列名称
    QString m_dbOrderSql;   //排序条件
    QString m_dbWhereSql;   //查询条件
    QString m_dbCountName;  //设置统计表行数的字段

    int m_iNotesPerPage;    //每页显示多少条数据
    QList<QString> m_ColumnNamesList;   //列名称集合,需要结合“查询列名称”进行设置
    QList<int> m_ColumnWidthList;       //列宽度集合

    //私有变量
    int m_iTotalNotes;       //共xx条数据
    int m_iTotalPages;       //共xx页
    int m_iCurrentPage;      //当前为第xx页

    QString m_sqlString;    //查询字符串
    QString m_sqlTemp;

    MySqlQuery *m_pSqlModel;
    DbNotesCount* m_pDbNotesCount;
};

#endif // DBPAGEWIDGET_H
